package edu.chen.JSON_GSONDdemo;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import edu.chen.bean.User;
import org.json.JSONObject;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class GSONDemo {
    public static void main(String[] args) {
        /**
         * 采用JAVA BEAN方式创建GSON对象
         * 在JavaBean的变量声明上可以加上注解：@SerializedName("")
         * 该注解为数据传输名称,即在变为GSON对象时的key
         * 在JavaBean的成员变量声明中,用“transient”修饰,可以使该变量在生成的GSON中不可见
         */
        User user = new User();
        user.setId(1);
        user.setUsername("chen");
        user.setPassword("19951217");
        //直接创建GSON对象
        Gson gson = new Gson();
        //通过GsonBuilder创建一个GSON
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setPrettyPrinting();
        //通过设定函数设置GSON的个性化操作
        gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
            public String translateName(Field field) {
                if (field.getName().equals("id"))
                    return "ID";
                return field.getName();
            }
        });
        Gson gson1 = gsonBuilder.create();
        /**
         * GSON解析
         * fromJson 将Json数据解析为JavaBean对象,可以在参数中指定Bean类型
         * toJson   将Bean对象解析为Json数据.
         */
        //JSON ---> User
        JSONObject jsonObject = new JSONObject(user);
        User desUser = gson1.fromJson(jsonObject.toString(),User.class);
        System.out.println(desUser);
        List<User> users = new ArrayList<User>();
        users.add(user);
        users.add(user);
        users.add(user);
        String json = gson1.toJson(users);
        //注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson gson = new Gson();
        Gson gson2 = new GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
                .enableComplexMapKeySerialization() //支持Map的key为复杂k对象的形式
                .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
                .setPrettyPrinting() //对json结果格式化.
                .setVersion(1.0)    //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
                //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
                //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
                .create();
        System.out.println(gson2.toJson(users));
    }
}
